'''
Created on Mar 29, 2012

@author: jorge

Modulo que encapsula los rpc relacionados al manejo de sesiones
'''
from tsjepublisher.models import DBSession
from tsjepublisher.models import Usuario
from pyramid.view import view_config
from pyramid.response import Response

@view_config(route_name='loginAttempt', renderer='json')
def LoginView(request):
    '''
    Intenta loguear un usuario al sistema, retorna el resultado del intento
    '''
    params = request.params
    session = request.session
    
    if(not "uid" in params or not "pwd" in params):
        return {"respuesta" : False , "causa" : "Los parametros ingresados son insuficientes."}
    
    user = params["uid"]
    pasw = params["pwd"]
    
    session["logged"] = False
    res = DBSession.query(Usuario).filter(Usuario.login == user)
    if(res.count() == 0):
        return {"respuesta" : False , "causa" : "El usuario ingresado no existe."}
    candidato = res.first()
    if(candidato.password == pasw):
        session["logged"] = True
        session['uid'] = candidato.idUsuario

        return {"respuesta" : True , "bienvenida" : "Bienvenido " + candidato.nombre + "!"}
    else:
        return {"respuesta" : False , "causa" : "El password ingresado es invalido."}

    
    return {"respuesta" : True , "bienvenida" : "Bienvenido "}


@view_config(route_name='logout')
def LogoutView(request):
    '''
    RPC para cerrar la sesion
    '''
    session = request.session  
    session["logged"] = False
    session['uid'] = -1
    session.invalidate()
    return Response('Ok')

@view_config(route_name='isLogged', renderer='json')
def isLoggedView(request):
    '''
    RPC para chequear si el usuario esta logueado
    '''
    session = request.session  
    return {"logged" : session["logged"] if "logged" in session else False}
    
@view_config(route_name='listUsers', renderer = 'json')
def listUsersView(request):
    '''
    Llamada a la vista, retorna el resultado del intento de logueo
    '''
    params = request.params
    session = request.session

    if isLoggedView(request)['logged']:
        return [p.toDict() for p in DBSession.query(Usuario)]##
    else:
        return []
    
import mmap
import transaction
from sqlalchemy.orm import undefer
from pyramid.httpexceptions import HTTPFound

@view_config(route_name='uploadTry')
def uploadImageView(request):
    '''
    Llamada a la vista, retorna el resultado del intento de logueo
    '''
    session = request.session
    if isLoggedView(request)['logged']:
        jorgem = DBSession.query(Usuario).filter_by(idUsuario=session['uid']).first()
        if 'upfile' in request.params and not request.params['upfile'] == '': 
            mapj = mmap.mmap(request.params['upfile'].file.fileno(), 0)
            jorgem.bg = mapj.read(mapj.size())
            a = 'foto ' + ("%.2f" % (float(mapj.size())/1024.0)) + 'kb'
        else:
            jorgem.bg = None
            a = 'foto default'
        transaction.commit() 
        return Response('Ok {' + a + '}')
    else:
        return Response('Login first')
    
    
@view_config(route_name='dynDownload')
def downloadImageView(request):
    '''
    Llamada a la vista, retorna el resultado del intento de logueo
    '''
    session = request.session
    if not isLoggedView(request)['logged']:
        return HTTPFound(location='/static/images/bg.jpg')
    else:
        logged_user = DBSession.query(Usuario).filter_by(idUsuario=session['uid']).options(undefer('bg')).first() 
        if logged_user == None or logged_user.bg == None: 
            return HTTPFound(location='/static/images/bg.jpg')
        else:
            return Response(logged_user.bg)
